from celery_tasks.main import celery_app
from django.template import loader
from django.conf import settings
from goods.utils import generate_static_index_html
import os
from goods.models import SKU


@celery_app.task(name='generate_static_detail_html')
def generate_static_detail_html(sku_id):
    """
    根据模板
    生成详情页的静态化
    在开发中，执行脚本文件,在goods文件夹下生成静态页面：
    chmod +x regenerate_detail_html.py
    ./regenerate_static_detail_html.py
    在goods文件夹下生成静态页面
    """
    # 获取要静态化的数据
    categories = generate_static_index_html()

    # 获得当前商品
    sku = SKU.objects.get(id=sku_id)
    # 把商品所有图片拿出来
    sku.image = sku.skuimage_set.all()

    # 当前商品的ｓpu
    goods = sku.goods
    # 商品的分类里的channenl　也能拿到
    goods.channel = goods.category1.goodschannel_set.all()

    # 构建当前商品的规格键
    # sku_key = [规格1参数id， 规格2参数id， 规格3参数id, ...]
    sku_specs = sku.skuspecification_set.order_by('spec_id')
    sku_key = []
    # 获取商品规格的信息
    for spec in sku_specs:
        sku_key.append(spec.option.id)

    # 获取当前商品的所有SKU
    skus = goods.sku_set.all()

    # 构建不同规格参数（选项）的sku字典
    # spec_sku_map = {
    #     (规格1参数id, 规格2参数id, 规格3参数id, ...): sku_id,
    #     (规格1参数id, 规格2参数id, 规格3参数id, ...): sku_id,
    #     ...
    # }
    spec_sku_map = {}
    for s in skus:
        # 获取sku的规格参数
        s_specs = s.skuspecification_set.order_by('spec_id')
        # 用于形成规格参数-sku字典的键
        key = []
        for spec in s_specs:
            key.append(spec.option.id)
        # 向规格参数-sku字典添加记录
        spec_sku_map[tuple(key)] = s.id

    # 获取当前商品的规格信息

    specs = goods.goodsspecification_set.order_by('id')
    # 若当前sku的规格信息不完整，则不再继续
    if len(sku_key) < len(specs):
        return
    for index, spec in enumerate(specs):
        # 复制当前sku的规格键
        key = sku_key[:]
        # 该规格的选项
        options = spec.specificationoption_set.all()
        for option in options:
            # 在规格参数sku字典中查找符合当前规格的sku
            key[index] = option.id
            # 给每个sku_id对应的商品的规格选项赋值
            option.sku_id = spec_sku_map.get(tuple(key))

        spec.options = options

    # 渲染模板，生成静态html文件
    context = {
        'categories': categories,
        'goods': goods,
        'specs': specs,
        'sku': sku
    }

    template = loader.get_template('detail.html')
    html_text = template.render(context)
    # 把模板保存在一个指定的文件中
    # file_path = os.path.join(settings.GENERATED_STATIC_HTML_FILES_DIR, 'detail.html')
    file_path = os.path.join(settings.GENERATED_STATIC_HTML_FILES_DIR, 'goods/'+str(sku_id)+'.html')
    with open(file_path, 'w') as f:
        f.write(html_text)


# 启动celery任务
# 进入celery_tasks所在目录，终端命令：celery -A celery_tasks.main worker -l info





